package at.spengergasse.dao.derby;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

import java.sql.Connection;
import java.util.Date;
import java.util.List;

import org.junit.BeforeClass;
import org.junit.Test;

import at.spengergasse.dao.BestellenDao;
import at.spengergasse.dao.util.JDBCConnectionController;
import at.spengergasse.model.Bestellen;
import at.spengergasse.model.Rechnung;

public class BestellenDaoDerbyImplTest
{

	private static Connection connection;
	private static BestellenDao dao;

	@BeforeClass
	public static void setUpBeforeClass() throws Exception
	{
		connection = JDBCConnectionController.getConnection();
		// connection = ConnectionPoolController.getConnection();

		dao = new BestellenDaoDerbyImpl();
	}

	@Test
	public void testSaveNew()
	{
		Bestellen newBestellen = new Bestellen(1L, 4);
		Rechnung rechnung = new Rechnung();
		rechnung.setId(Long.valueOf(1));
		newBestellen.setRechnung(rechnung);
		int numberOfRecords = dao.save(connection, newBestellen);
		assertEquals(1, numberOfRecords);
		assertNotNull(newBestellen.getId());
		assertNotNull(newBestellen.getLastModifiedTS());
		List<Bestellen> bestellung = dao.findAll(connection);
		assertEquals(6, bestellung.size());
	}

	@Test
	public void testSaveExisting()
	{
		Bestellen existingBestellen = dao.findById(connection, Long.valueOf(1));
		existingBestellen.setProduktId(2L);
		existingBestellen.setMenge(10);
		existingBestellen.setPosition(2);
		Date lastModTS = existingBestellen.getLastModifiedTS();
		dao.save(connection, existingBestellen);
		assertFalse(lastModTS.equals(existingBestellen.getLastModifiedTS()));
		Bestellen checkBestellen = dao.findById(connection, Long.valueOf(1));
		assertEquals(new Long(2), checkBestellen.getProduktId());
		assertEquals(10, checkBestellen.getMenge());
		assertEquals(2, checkBestellen.getPosition());
	}

	@Test
	public void testDelete()
	{
		Bestellen bestellen = dao.findById(connection, Long.valueOf(2));
		dao.delete(connection, bestellen);
		List<Bestellen> bestellenList = dao.findAll(connection);
		assertEquals(5, bestellenList.size());
	}

	@Test
	public void testFindById()
	{
		Bestellen bestellen = dao.findById(connection, Long.valueOf(3));
		assertEquals(Long.valueOf(1), bestellen.getProduktId());
		assertEquals(Long.valueOf(2), bestellen.getRechnungsId());
		assertEquals(10, bestellen.getMenge());
		assertEquals(1, bestellen.getPosition());
	}

	@Test
	public void testFindByIdWithNonExistingId()
	{
		Bestellen bestellen = dao.findById(connection, Long.valueOf(999));
		assertNull(bestellen);
	}

	@Test
	public void testFindAll()
	{
		List<Bestellen> bestellen = dao.findAll(connection);
		assertEquals(5, bestellen.size());
		// System.out.println(kunde.toString());
		assertEquals(Long.valueOf(2), bestellen.get(0).getProduktId());
		assertEquals(Long.valueOf(1), bestellen.get(0).getRechnungsId());
		assertEquals(10, bestellen.get(0).getMenge());
		assertEquals(2, bestellen.get(0).getPosition());
	}

}
